//
//  DMConfigManager.h
//  DualMediationSDK
//
//  Created by AI Assistant
//  Copyright © 2024 YourCompany. All rights reserved.
//

#import <Foundation/Foundation.h>
#import "DMAdConfig.h"
#import "DMConfigDelegate.h"

NS_ASSUME_NONNULL_BEGIN

/**
 * 配置更新类型
 */
typedef NS_ENUM(NSUInteger, DMConfigUpdateType) {
    DMConfigUpdateTypeLocal = 0,    // 本地配置更新
    DMConfigUpdateTypeRemote,       // 远程配置更新
    DMConfigUpdateTypeMerged        // 合并配置更新
};

// DMStrategyConfig 和 DMABTestConfig 已在 DMAdConfig.h 中定义

/**
 * DM配置管理器 - 策略灵活与动态配置
 * 
 * 核心职责：
 * 1. 本地配置管理和持久化
 * 2. 远程配置拉取和热更新
 * 3. AB测试配置和实验分流
 * 4. 聚合平台优先级动态调整
 * 5. 广告位与平台映射管理
 * 6. 配置版本控制和回滚
 */
@interface DMConfigManager : NSObject

#pragma mark - Singleton

/**
 * 获取单例实例
 */
+ (instancetype)sharedManager;

#pragma mark - Delegate

/**
 * 设置配置委托
 */
@property (nonatomic, weak, nullable) id<DMConfigDelegate> delegate;

#pragma mark - Initialization

/**
 * 初始化配置管理器
 * @param config 初始配置
 * @param completion 完成回调
 */
- (void)initializeWithConfig:(DMAdConfig *)config
                  completion:(void(^)(BOOL success, NSError * _Nullable error))completion;

/**
 * 检查是否已初始化
 */
@property (nonatomic, readonly) BOOL isInitialized;

#pragma mark - Configuration Access

/**
 * 获取当前完整配置
 */
- (DMAdConfig *)getCurrentConfig;

/**
 * 获取广告位配置
 * @param placementId 广告位ID
 */
- (nullable NSDictionary *)getPlacementConfig:(NSString *)placementId;

/**
 * 根据广告位ID获取对应的广告单元ID
 * @param placementId 广告位ID
 */
- (nullable NSString *)getAdUnitIdForPlacement:(NSString *)placementId;

/**
 * 根据广告单元ID检查是否存在
 * @param adUnitId 广告单元ID
 */
- (nullable NSString *)getAdUnitForId:(NSString *)adUnitId;

/**
 * 获取聚合平台配置
 * @param platform 平台名称
 */
- (nullable NSDictionary *)getPlatformConfig:(NSString *)platform;

/**
 * 获取策略配置
 * @param strategyId 策略ID
 */
- (nullable DMStrategyConfig *)getStrategyConfig:(NSString *)strategyId;

#pragma mark - Remote Configuration

/**
 * 设置远程配置服务器URL
 * @param url 服务器URL
 */
- (void)setRemoteConfigURL:(NSURL *)url;

/**
 * 拉取远程配置
 * @param completion 完成回调
 */
- (void)fetchRemoteConfig:(void(^)(BOOL success, DMConfigUpdateType updateType, NSError * _Nullable error))completion;

/**
 * 启用/禁用自动配置更新
 * @param enabled 是否启用
 * @param interval 更新间隔（秒）
 */
- (void)setAutoUpdateEnabled:(BOOL)enabled interval:(NSTimeInterval)interval;

/**
 * 检查配置更新可用性
 * @param completion 检查结果回调
 */
- (void)checkForConfigUpdates:(void(^)(BOOL hasUpdates, NSDictionary * _Nullable updateInfo))completion;

#pragma mark - A/B Testing

/**
 * 获取AB测试配置
 * @param experimentId 实验ID
 */
- (nullable DMABTestConfig *)getABTestConfig:(NSString *)experimentId;

/**
 * 获取用户的AB测试分组
 * @param experimentId 实验ID
 * @param userId 用户ID
 */
- (nullable NSString *)getABTestVariant:(NSString *)experimentId userId:(NSString *)userId;

/**
 * 设置AB测试配置
 * @param config AB测试配置
 */
- (void)setABTestConfig:(DMABTestConfig *)config;

/**
 * 移除AB测试配置
 * @param experimentId 实验ID
 */
- (void)removeABTestConfig:(NSString *)experimentId;

/**
 * 获取所有活跃的AB测试
 */
- (NSArray<DMABTestConfig *> *)getActiveABTests;

#pragma mark - Platform Priority

/**
 * 设置聚合平台优先级
 * @param priorities 优先级配置 [@{@"platform": @"MAX", @"priority": @1}, ...]
 * @param adType 广告类型（可选，为nil时应用到所有类型）
 */
- (void)setPlatformPriorities:(NSArray<NSDictionary *> *)priorities forAdType:(nullable NSString *)adType;

/**
 * 获取聚合平台优先级
 * @param adType 广告类型
 */
- (NSArray<NSDictionary *> *)getPlatformPrioritiesForAdType:(NSString *)adType;

/**
 * 动态调整平台优先级（基于性能数据）
 * @param performanceData 性能数据
 * @param adType 广告类型
 */
- (void)adjustPlatformPriorities:(NSDictionary *)performanceData forAdType:(NSString *)adType;

#pragma mark - Placement Management

/**
 * 添加广告位配置
 * @param placementId 广告位ID
 * @param config 配置信息
 */
- (void)addPlacementConfig:(NSString *)placementId config:(NSDictionary *)config;

/**
 * 更新广告位配置
 * @param placementId 广告位ID
 * @param config 配置信息
 */
- (void)updatePlacementConfig:(NSString *)placementId config:(NSDictionary *)config;

/**
 * 移除广告位配置
 * @param placementId 广告位ID
 */
- (void)removePlacementConfig:(NSString *)placementId;

/**
 * 获取所有广告位配置
 */
- (NSDictionary<NSString *, NSDictionary *> *)getAllPlacementConfigs;

#pragma mark - Strategy Management

/**
 * 添加策略配置
 * @param config 策略配置
 */
- (void)addStrategyConfig:(DMStrategyConfig *)config;

/**
 * 更新策略配置
 * @param config 策略配置
 */
- (void)updateStrategyConfig:(DMStrategyConfig *)config;

/**
 * 移除策略配置
 * @param strategyId 策略ID
 */
- (void)removeStrategyConfig:(NSString *)strategyId;

/**
 * 获取所有策略配置
 */
- (NSArray<DMStrategyConfig *> *)getAllStrategyConfigs;

/**
 * 根据条件筛选策略
 * @param filters 筛选条件
 */
- (NSArray<DMStrategyConfig *> *)getStrategyConfigsWithFilters:(NSDictionary *)filters;

#pragma mark - Configuration Versioning

/**
 * 获取当前配置版本
 */
- (NSString *)getCurrentConfigVersion;

/**
 * 获取配置历史版本列表
 */
- (NSArray<NSString *> *)getConfigVersionHistory;

/**
 * 回滚到指定版本
 * @param version 版本号
 * @param completion 完成回调
 */
- (void)rollbackToVersion:(NSString *)version
               completion:(void(^)(BOOL success, NSError * _Nullable error))completion;

/**
 * 创建配置快照
 * @param description 快照描述
 */
- (NSString *)createConfigSnapshot:(NSString *)description;

#pragma mark - Configuration Export/Import

/**
 * 导出当前配置
 * @param format 导出格式 ("json", "plist")
 * @param completion 导出结果回调
 */
- (void)exportConfig:(NSString *)format
          completion:(void(^)(NSData * _Nullable data, NSError * _Nullable error))completion;

/**
 * 导入配置
 * @param data 配置数据
 * @param format 数据格式
 * @param merge 是否合并（否则替换）
 * @param completion 导入结果回调
 */
- (void)importConfig:(NSData *)data
              format:(NSString *)format
               merge:(BOOL)merge
          completion:(void(^)(BOOL success, NSError * _Nullable error))completion;

#pragma mark - Configuration Validation

/**
 * 验证配置有效性
 * @param config 待验证的配置
 */
- (BOOL)validateConfig:(NSDictionary *)config error:(NSError **)error;

/**
 * 获取配置验证规则
 */
- (NSDictionary *)getConfigValidationRules;

/**
 * 设置自定义验证规则
 * @param rules 验证规则
 */
- (void)setCustomValidationRules:(NSDictionary *)rules;

#pragma mark - Performance Monitoring

/**
 * 启用配置性能监控
 * @param enabled 是否启用
 */
- (void)setPerformanceMonitoringEnabled:(BOOL)enabled;

/**
 * 获取配置性能统计
 */
- (NSDictionary *)getConfigPerformanceStats;

/**
 * 重置性能统计
 */
- (void)resetPerformanceStats;

#pragma mark - Debug & Utilities

/**
 * 启用调试模式
 * @param enabled 是否启用
 */
- (void)setDebugMode:(BOOL)enabled;

/**
 * 获取配置调试信息
 */
- (NSDictionary *)getDebugInfo;

/**
 * 强制刷新所有缓存
 */
- (void)forceRefreshCache;

/**
 * 获取配置缓存状态
 */
- (NSDictionary *)getCacheStatus;

/**
 * 更新SDK配置
 * @param configuration SDK配置
 */
- (void)updateConfiguration:(DMSDKConfiguration *)configuration;

@end

NS_ASSUME_NONNULL_END 